package com.liy.cloud.common.yy.service.impl;

import com.das.cloud.osc.common.yy.entity.*;
import com.liy.cloud.common.yy.entity.*;
import com.liy.cloud.common.yy.service.YyDataNoticeService;
import com.liy.cloud.common.yy.service.YyEquVersionService;
import com.liy.cloud.common.yy.service.YyParamVersionSendService;
import com.das.framework.common.exception.BusinessException;
import com.das.framework.common.service.impl.BaseServiceImpl;
import com.das.framework.common.utils.DateUtil;
import com.das.framework.common.utils.Tools;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.liy.cloud.common.yy.dao.YyParamVersionDao;
import com.liy.cloud.common.yy.service.YyParamVersionService;
import com.das.framework.common.dao.IBaseDao;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;

/**
 * 参数版本信息表 Service接口服务实现
 *
 * @author libs
 * @ClassName: YyParamVersionServiceImpl
 * @Description:
 * @date: 2018-08-14 16:03:12
 */
@Service
public class YyParamVersionServiceImpl extends BaseServiceImpl<YyParamVersion, String> implements YyParamVersionService {

    protected static Logger log = LoggerFactory.getLogger(YyParamVersionServiceImpl.class);

    @Autowired
    private YyParamVersionDao yyParamVersionDao;

    @Override
    public IBaseDao<YyParamVersion, String> getDao() {
        return yyParamVersionDao;
    }

    // 通知记录
    @Autowired
    YyDataNoticeService dataNoticeService;

    // 参数下发日志记录
    @Autowired
    YyParamVersionSendService paramVersionSendService;

    // 设备版本
    @Autowired
    YyEquVersionService equVersionService;


    /**
     *   设备参数下发
     **/
    @Override
    public void allocateParamEntry(List<YyEquParamVersion> list) throws Exception {
        Gson gson = new Gson();

        // 当前登录的用户
        // String userAccount = super.getLoginUser().getAccount();  // TODO
        String userAccount = "";
        for (YyEquParamVersion ele : list) {
            // 设备终端编号
            String deviceId = ele.getDeviceId();
            // 设备名称
            String deviceName = ele.getDeviceName();
            // 参数种类编码
            String paramTypeCode = ele.getParamTypeCode();
            // 参数种类名称
            String paramTypeName = ele.getParamTypeName();
            // 参数版本号
            String paramVersion = ele.getParamVersion();
            // 版本类型 version
            String versionCode;

            // 根据 参数的版本号paramVersion查询 版本信息
            YyParamVersion queryParamVersion = new YyParamVersion();
            queryParamVersion.setParamVersion(paramVersion);
            List<YyParamVersion> confirmParamVersionList = super.findList(queryParamVersion);
            if (confirmParamVersionList.size() > 0) {
                YyParamVersion confirmParamVersion = confirmParamVersionList.get(0);
                versionCode = confirmParamVersion.getVersionCode();
            } else {
                throw new BusinessException("数据异常,下发的参数版本号: " + paramVersion + " 不存在!");
            }

            // 1.通知记录
            YyDataNotice newDataNotice = new YyDataNotice();
            // ID
            newDataNotice.setId(Tools.getNewUUID());
            // 数据类型 -- 固定值
            newDataNotice.setDataType("paramDown");
            // 下发时间
            newDataNotice.setSendDate(DateUtil.getTimeNow());
            // 下发地址 --> 具体要下发的设备编号
            newDataNotice.setDestId(deviceId);
            // 处理时间 运营管理子系统入库时此字段默认为空
            newDataNotice.setDealTime(null);
            // 通知类容数据
            String md5 = DigestUtils.md5Hex(Tools.getNewUUID());
            YyNoticeContentJsonEntity noticeContentJson = new YyNoticeContentJsonEntity(paramTypeName, versionCode, md5);
            String contentJsonString = gson.toJson(noticeContentJson);
            // 通知内容
            newDataNotice.setNoticeContent(contentJsonString);

            // 通知记录入库
            dataNoticeService.add(newDataNotice);

            // 2.参数下发日志记录
            YyParamVersionSend newParamVersionSend = new YyParamVersionSend();
            // Id
            newParamVersionSend.setId(Tools.getNewUUID());
            // 参数种类
            newParamVersionSend.setParamCode(paramTypeCode);
            // 参数版本
            newParamVersionSend.setParamVersion(paramVersion);
            // 设备编号
            newParamVersionSend.setDeviceId(deviceId);
            // 下发操作员
            newParamVersionSend.setOper(userAccount);  // TODO
            // 下发时间
            newParamVersionSend.setSendDate(DateUtil.getTimeNow());
            // 下发类型  --> 运营管理子系统入库时此字段默认为空，由系统数据处理进行更新
            newParamVersionSend.setSendType(null);

            // 参数下发日志记录入库
            paramVersionSendService.add(newParamVersionSend);

            // 3.设备参数版本
            YyEquVersion newEquVersion = new YyEquVersion();
            // Id
            newEquVersion.setId(Tools.getNewUUID());
            // 设备编号
            newEquVersion.setDeviceId(deviceId);
            // 参数类型
            newEquVersion.setParamCode(paramTypeCode);
            // 版本类型
            newEquVersion.setVersionCode(versionCode);
            // 版本编号
            newEquVersion.setParamVersion(paramVersion);

            // 设备参数版本入库
            equVersionService.add(newEquVersion);
        }
    }


    @Override
    public YyParamVersion getVersion(Map<String, String> params) throws Exception {
        String paramCode = params.get("paramCode");
        String versionPrefix =  params.get("versionPrefix");
        String oper =  params.get("oper");
        // 查询参数编码为 paramCode 的 参数版本流水号最大的记录
        YyParamVersion lastVersion = yyParamVersionDao.selectLastVersion(paramCode);
        int lastNo = 0;
        // 当前时间
        String timeNow = DateUtil.getTimeNow();
        // 参数版本中的日期
        String versionTime = timeNow.substring(0, 10).replaceAll("-","");
        if(lastVersion != null){
            String lastParamVersion = lastVersion.getParamVersion();
            int len = lastParamVersion.length();
            // 获取 lastParamVersion 中的日期
            String lastDay = lastParamVersion.substring(len - 6, len - 4);
            // 当前日
            String nowDay = versionTime.substring(6);
            if(lastDay.equals(nowDay)){
                String lastNoStr = lastParamVersion.substring(len-4, len);
                lastNo = Integer.parseInt(lastNoStr);
            }
        }
        // 新的流水号为最大流水号+1，默认为0001
        StringBuffer newNoBuffer = new StringBuffer(String.valueOf(lastNo + 1));
        for (int i = newNoBuffer.length(); i < 4; i++) {
            newNoBuffer.insert(0,"0");
        }
        // 保存新的参数版本信息
        YyParamVersion newVersion = new YyParamVersion();
        newVersion.setId(Tools.getNewUUID());
        newVersion.setParamCode(paramCode);
        newVersion.setParamVersion(versionPrefix + versionTime + newNoBuffer);
        newVersion.setCreateTime(timeNow);
        newVersion.setOper(oper);
        // 发布方系统编码 默认CLC的编码为300
        newVersion.setSyscode("300");
        // 格式版本 默认为01
        newVersion.setFormat("01");
        yyParamVersionDao.insertSelective(newVersion);
        return newVersion;
    }

    @Override
    public void deleteBatch(List<String> ids) {
        for (String id : ids) {
            yyParamVersionDao.deleteByPrimaryKey(id);
        }
    }

    /**
     * 将版本参数升级为最新的版本
     */
    @Override
    public int setLatestVersion(YyParamVersion yyParamVersion) throws Exception {
        // 旧的
        String oldParamVersion = yyParamVersion.getParamVersion();
        String oldId = yyParamVersion.getId();
        String paramCode = yyParamVersion.getParamCode();
        YyParamVersion oldParanVersonEntity =yyParamVersionDao.selectByPrimaryKey(oldId);
        // 最新的 查询参数编码为 paramCode 的 参数版本流水号最大的记录
        YyParamVersion lastYyParamVersionEntity = yyParamVersionDao.selectLastVersion(paramCode);
        String lastParamVersionStr = lastYyParamVersionEntity.getParamVersion();
        if(oldParamVersion.equals(lastParamVersionStr)){ // 本来就是最新版本
            return 0;
        }else {
            int lastNo = 0;
            // 当前日期
            Date currentDate = new Date();
            String nowDay = DateUtil.dateToString(currentDate);
            int len = lastParamVersionStr.length();
            // 最新记录日期 lastParamVersionStr 20181116 0001
            String lastDay = lastParamVersionStr.substring(lastParamVersionStr.length()-12, lastParamVersionStr.length()-4);
            String newParamVersion = oldParamVersion.substring(0, oldParamVersion.length()-12);
            if(lastDay.equals(nowDay)){  // 最新记录的日期 ==  当前日期
                String lastNoStr = lastParamVersionStr.substring(len-4, len);
                lastNo = Integer.parseInt(lastNoStr);
                // 新的流水号为最大流水号+1，默认为0001
                StringBuffer newNoBuffer = new StringBuffer(String.valueOf(lastNo + 1));
                for (int i = newNoBuffer.length(); i < 4; i++) {
                    newNoBuffer.insert(0,"0");
                }
                newParamVersion = newParamVersion + lastDay + newNoBuffer;
            }else {
                // 最新记录的日期 不等于 当前日期 安装最新的日期新增
                newParamVersion = newParamVersion + nowDay + "0001";
            }
            oldParanVersonEntity.setId(Tools.getNewUUID());
            oldParanVersonEntity.setParamVersion(newParamVersion);
            oldParanVersonEntity.setRemark("此由版本: " + oldParamVersion + " 升级而来");
            // 新增最新版本
            yyParamVersionDao.insertSelective(oldParanVersonEntity);
            return 1;
        }


    }
}